//大数据-191-刘艺

#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>


int main(){
    char strMapName[]= "ShareMemory";                 // 内存映射对象名称
    char strComData[]= "你好啊，对面的进程！";           // 共享内存中的数据
    char consoleTitleName[][10]={"QQ", "Wechat"};    // 两个窗口标题文字
    LPVOID pBuffer;                                 // 指向共享内存的指针

    //(1)尝试打开一个命名的映射文件（内存）对象
    HANDLE hMap = OpenFileMappingA( FILE_MAP_ALL_ACCESS, 0, strMapName);

    if (NULL == hMap){          // 第一个进程一定打开失败（因为还没有创建）

        SetConsoleTitle( consoleTitleName[0]);  //设置控制台窗口标题

        // (2) 创建文件映射（内存）

        hMap = CreateFileMapping( INVALID_HANDLE_VALUE,
                                  NULL,
                                  PAGE_READWRITE,
                                  0,
                                  strlen(strComData) + 1,
                                  strMapName );

        //（3）映射对象的一个视图，得到指向共享内存的指针
        pBuffer = MapViewOfFile( hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);

        //（4）向该共享内存空间拷贝字符串
        strcpy((char*)pBuffer, strComData);
        printf("写入共享内存数据：%s\n",( char* )pBuffer);

    } else{ // 第二个进程会成功打开（第一个进程创建的）映射文件（内存）对象

        SetConsoleTitle( consoleTitleName[1]);

        // （3）映射对象的一个视图，得到指向共享内存的指针
        pBuffer = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);

        // （4）从该内存空间读出字符串
        printf("读取共享内存数据：%s\n",( char* )pBuffer );
    }
    getch();

    UnmapViewOfFile( pBuffer ); // （5）解除文件映射
    CloseHandle( hMap );

    return 0;

}